package com.example.projectjava.controller;

import com.example.projectjava.dao.UserDao;
import com.example.projectjava.service.UserService;
import com.example.projectjava.util.JsonResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

@Controller
@CrossOrigin
@Tag(name = "用户接口")
public class UserController {


    @Autowired   //此注解的作用：是spring的基本特性，它将项目中运行过程中的JdbcTemplate,自动创建并实例化传入
    JdbcTemplate jdbcTemplate;

    @Autowired
    UserService userService;


    @ResponseBody
    @GetMapping("/register")
    //求前端传递  帐号，密码，确认密码，出生日期，手机号五个参数

    @Operation(summary = "用户注册")
    @Parameters({
            @Parameter(name ="username",description="用户名(不允许为空)",in = ParameterIn.QUERY,required = false),
            @Parameter(name ="pwd",description="密码(不允许为空)",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="sure_pwd",description="确认密码(必需和密码字段相同)",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="birthday",description="出生日期格式为yyyy-MM-dd",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="phone",description="11位的手机号",in = ParameterIn.QUERY,required = true)

    })
    public JsonResponse userRegister(String username,    //注册条件判断
                                     String pwd,
                                     String sure_pwd,
                                     String birthday, String phone) {
        // String a = null;
        //  a.equals("xxx")

        JsonResponse jsonResponse = new JsonResponse();
        if (pwd == null || pwd.equals("")) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("密码不能为空");
            return jsonResponse;
        }

        if (pwd != null && !pwd.equals(sure_pwd)) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("两次输入的密码不一致");
            return jsonResponse;
        }

        if (username == null || username.equals("")) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("用户名不能为空");
            return jsonResponse;
        }

        if (phone == null || phone.equals("")) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("手机号不能为空");
            return jsonResponse;
        }
        if (birthday == null || birthday.equals("")) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("出生日期不能为空");
            return jsonResponse;
        }


        //把前端传入的数据成功的写入到数据库才代表注册成功
        //在此处我们先调用jdbcteampate中的update方法
        // String sql = "insert into appUser(userName,pwd,birthday,mobilephone) values(?,?,?,?)";
        //update方法两个参数，第一个参数传入要执行的sql语句(upddate方法可以执行insert,delete,update语句)
        //第二个参数是一个可变参数据
        try {
            ///  jdbcTemplate.update(sql, userName, pwd, birthday, mobmielPhone);
            userService.userRegister(username, pwd, birthday, phone);    //调用service层的userRegister方法判断用户名手机号是否重复
            jsonResponse.setCode(0);
            jsonResponse.setMsg("注册成功");
        } catch (Exception e) {
            e.printStackTrace();
            jsonResponse.setCode(1);
            jsonResponse.setMsg("注册失败:" + e.getMessage());
        }
        return jsonResponse;
    }

    /**
     * 用户登录的方法
     *
     * @param username
     * @param pwd
     * @return //?userName=manager&password=123456
     */
    @ResponseBody
    @RequestMapping ("/login")
    @Operation(summary = "用户登录")
    @Parameters({
            @Parameter(name ="username",description="用户名(不允许为空)",in = ParameterIn.QUERY,required = false),
            @Parameter(name ="pwd",description="密码(不允许为空)",in = ParameterIn.QUERY,required = true)
    })
    public JsonResponse userLogin(String username, String pwd) {
        JsonResponse jsonResponse = new JsonResponse();
        try {
            userService.userLogin(username, pwd);    //调用service层的userLogin方法判断用户名密码是否正确
            jsonResponse.setCode(0);
            jsonResponse.setMsg("登录成功");
        } catch (Exception e) {
            e.printStackTrace();
            jsonResponse.setCode(1);
            jsonResponse.setMsg("登录失败:" + e.getMessage());
        }
        return jsonResponse;
    }


    /**
     * 查询所有用户信息的方法
     *
     * @return
     */
    @ResponseBody
    @GetMapping("/queryAllUser")
    @Operation(summary  = "查询所有用户")
    public JsonResponse queryAllUser() {
        JsonResponse jsonResponse = new JsonResponse();
        List<Map<String, Object>> userList = userService.queryAllUser();    //调用service层的queryAllUser方法查询所有用户信息
        if (userList == null || userList.size() == 0) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("查询失败，用户列表为空");
            return jsonResponse;
        }
        jsonResponse.setCode(0);
        jsonResponse.setMsg("查询成功");
        jsonResponse.setData(userList);
        return jsonResponse;
    }

    @ResponseBody
    @GetMapping("/queryUser")
    @Operation(summary  = "查询用户")
    @Parameter(name ="username",description="用户名(不允许为空)",in = ParameterIn.QUERY,required = false)
    public JsonResponse queryUser(String username) {
        JsonResponse jsonResponse = new JsonResponse();
        List<Map<String, Object>> user = userService.queryUserByName(username);    //调用service层的queryUser方法查询指定用户信息
        if (user == null || user.size() == 0) {
            jsonResponse.setCode(1);
            jsonResponse.setMsg("查询失败，用户不存在");
            return jsonResponse;
        }
        jsonResponse.setCode(0);
        jsonResponse.setMsg("查询成功");
        jsonResponse.setData(user);
        return jsonResponse;
    }

    @ResponseBody
    @GetMapping("/deleteUser")
    @Operation(summary  = "删除用户")
    @Parameters({
            @Parameter(name ="username",description="用户名(不允许为空)",in = ParameterIn.QUERY,required = false)
    })
    public JsonResponse deleteUser(String username) {
        JsonResponse jsonResponse = new JsonResponse();
        try {
            userService.deleteUser(username);
            jsonResponse.setCode(0);
            jsonResponse.setMsg("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            jsonResponse.setCode(1);
            jsonResponse.setMsg("删除失败:" + e.getMessage());
        }
        return jsonResponse;
    }

    @ResponseBody
    @GetMapping("/updateUser")
    @Operation(summary = "更新用户信息")
    @Parameters({
            @Parameter(name ="username",description="用户名(不允许为空)",in = ParameterIn.QUERY,required = false),
            @Parameter(name ="pwd",description="密码(不允许为空)",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="sure_pwd",description="确认密码(必需和密码字段相同)",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="birthday",description="出生日期格式为yyyy-MM-dd",in = ParameterIn.QUERY,required = true),
            @Parameter(name ="phone",description="11位的手机号",in = ParameterIn.QUERY,required = true)

    })
    public JsonResponse updateUser(String username, String pwd, String birthday, String phone) {
        JsonResponse jsonResponse = new JsonResponse();
        try {
            userService.updateUser(username, pwd, birthday, phone);
            jsonResponse.setCode(0);
            jsonResponse.setMsg("更新成功");
        } catch (Exception e) {
            e.printStackTrace();
            jsonResponse.setCode(1);
            jsonResponse.setMsg("更新失败:" + e.getMessage());
        }
        return jsonResponse;
    }
}
//null
//含义:
//null 表示一个引用变量不指向任何对象。
//它是一个特殊的值，表示该变量当前没有引用任何有效的对象实例。

//使用场景:
//
//用于检查对象是否已经被初始化。
//用于避免在未初始化的对象上调用方法，以防止 NullPointerException。

//isEmpty()
//含义:
//isEmpty() 是一个方法，通常用于检查字符串、集合（如 List, Set, Map）等是否不包含任何元素。
//对于字符串，isEmpty() 检查字符串的长度是否为0。
//对于集合，isEmpty() 检查集合中是否没有元素。

//使用场景:
//
//用于检查字符串是否为空字符串（即长度为0）。
//用于检查集合是否为空（即不包含任何元素）。
